/*
 * Description:guest对外服务服务端实现类
 */
#ifndef RECVFROMHOSTSERVICE_H
#define RECVFROMHOSTSERVICE_H

#include <string>
#include <cstdint>
#include "service.h"
#include "interface.h"
#include "guest2host.pb.h"

namespace GUEST {
    const std::string SA_VM_QUICK_SHUTDOWN = "SA_VM_QUICK_SHUTDOWN";
    const std::string CALL_TYPE = "CALL_TYPE";

class RecvFromHost : public COMMON::Service {
public:
    RecvFromHost() : COMMON::Service("RecvFromHost") {}
    ~RecvFromHost() = default;

    /********************
     * 函数：InitService
     * 功能：初始化服务
     * 参数：无
     * 返回：0初始化成功，其他有错误
     ********************/
    int InitService();

    /********************
     * 函数：DeInitService
     * 功能：关闭服务
     * 参数：无
     * 返回：成功返回0,失败返回-1
     ********************/
    int DeInitService();

    /********************
     * 函数：Dispatch
     * 功能：分发接收到的指令
     * 参数：call [in] 调用入参
     *      res [out] 调用返回值
     * 返回：无
     ********************/
    void Dispatch(Guest::protobuf::link::Call &call, Guest::protobuf::link::Result &res);

    /********************
     * 函数：UpdateFile
     * 功能：更新文件
     * 参数：文件名,文件的哈希值
     * 返回：是否更新成功
     ********************/
    bool UpdateFile(RecvFromHost &service, const std::string &fileName, const std::string &fileHash);

    /********************
     * 函数：ModifyResolution
     * 功能：修改分辨率
     * 参数：虚拟机surface宽度，虚拟机surface高度，是否处于安装流程
     * 返回：是否修改成功
     ********************/
    bool ModifyResolution(RecvFromHost &service, const uint32_t surfaceWidth, const uint32_t surfaceHeight,
                          const bool isInstall);

    /********************
     * 函数：UpdateCallback
     * 功能：文件更新回调
     * 参数：N/A
     * 返回：N/A
     ********************/
    void UpdateCallback();

    /********************
     * 函数：IsWinLogon
     * 功能：判断windows是否登录
     * 参数：无
     * 返回：是否更新成功
     ********************/
    bool IsWinLogon();

    /********************
    * 函数：NetConfig
    * 功能：配置网络
    * 参数：windows IP, gatewayIp
    * 返回：配置结果
    ********************/
    bool NetConfig(const std::string &ipAddress, const std::string &gatewayIp);

  /********************
    * 函数：CorrectTime
    * 功能：修正虚拟机时间和时区
    * 参数：host侧的时间，host侧的时区
    * 返回：同步结果
    ********************/
    bool CorrectTime(const std::string &hostTime, int timeZoneOffset);

    /********************
    * 函数：SetOsType
    * 功能：设置宿主机OS类型
    * 参数：OH或Linux
    * 返回：无
    ********************/
    void SetOsType(const std::string &osType);

    /********************
    * 函数：GetAvailableDriverCount
    * 功能：获取可用盘符数量
    * 参数：NA
    * 返回：可用盘符数量
    ********************/
    int GetAvailableLetterCount();

    /********************
    * 函数：SetAutoSyncDnsEnabled
    * 功能：设置是否从host侧同步dns
    * 参数：enabled
    * 返回：NA
    ********************/
    void SetAutoSyncDnsEnabled(bool enabled);

    /********************
    * 函数：QuickShutdown
    * 功能：快速关机NtShutdownSystem
    * 参数：NA
    * 返回：NA
    ********************/
    void QuickShutdown();

    /********************
    * 函数：SetForceShutdownState
    * 功能：设置ForceShutdown状态
    * 参数：state
    * 返回：NA
    ********************/
    void SetForceShutdownState(bool state);

    /********************
    * 函数：GetForceShutdownState
    * 功能：查询ForceShutdown状态
    * 参数：NA
    * 返回：bool
    ********************/
    bool GetForceShutdownState();

    /********************
    * 函数：GetDriverUpdateState
    * 功能：查询驱动更新状态
    * 参数：NA
    * 返回：bool
    ********************/
    bool GetDriverUpdateState();

#ifdef _FUZZ
    /********************
     * 函数：StartFuzz
     * 功能：Fuzz开始
     * 参数：无
     * 返回：无
     ********************/
    int StartFuzz() override;
#endif
private:
    std::string m_gateway {};
    std::string m_hostos = "OH"; // 默认host侧为OH
    bool autoSyncDnsEnabled = false; // 是否自动同步host侧dns
    bool forceShutdownState = false;
#ifdef _FUZZ
    bool isFuzzMode = false;
#endif
};
} // namespace GUEST
#endif // RECVFROMHOSTSERVICE_H